/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package ymodem.transfer;
/**
*
* @author maziar
*/
import java.io.File;
import java.io.ByteArrayInputStream;
//import org.apache.log4j.Logger;
/**!
* This Class creat the packet for transfer according the ymodem protocoll YMODEM 1K
* in first step creat the telegramm [SOH 00 FF "Filename" NULL[128 - Filename.length] CRC CRC]
*XMODEM-1k blocks, CRC mode
*--------------------------
* SENDER RECEIVER
* <-- C (command:rb)
* SOH 00 FF foo.c NUL[123] CRC CRC -->
* <-- ACK
* <-- C
* STX 01 FE Data[1024] CRC CRC -->
* <-- ACK
* STX 02 FD Data[1024] CRC CRC -->
* <-- ACK
* STX 03 FC Data[1000] CPMEOF[24] CRC CRC -->
* <-- ACK
* EOT ( 10 times) -->
* <-- ACK
*
* second step creat the telgramm [STX 0X !n DATA[1024] CRC CRC]
* @author OOBD.org
* @version 1.0
*/
public class InitPacket {
private int packetnumber;
private boolean isPacketInit;
private boolean isEnd;
private boolean isSectorZero = true;
private byte[] packet;
private byte[] data ;
private byte[] innerdata;
private byte[] header = new byte[3];
private byte[] crcfooter = new byte[2];
private int checksum = 0;
private int intCrcLow;
private int intCrcHigh;
private File file;
//static Logger log = Logger.getLogger(InitPacket.class);
//private CRC16 crc = new CRC16(TransferSpecification.initValueZero);
private CRC16 crc = new CRC16();
/**!
* Gives back the Low-Byte CRC
* @return the Sector
*/
private int getCRCLow(){
return intCrcLow;
}
/**!
* Gives back the High-Byte CRC
* @return the Sector
*/
private int getCRCHigh(){
return intCrcHigh;
}
/**!
* Gives information about the Sector Zero
* @return is the sector Zero
*/
public boolean getSectorZero(){
return isSectorZero;
}
public void setPacknumbet(int packnum){
this.packetnumber = packnum;
}
/**!
* Build the Sector Zero
* @param file to create the Filename and File Size and the CRC
* @return the Sector Zero as Byte array with the length 128 Bytes
* File file
*/
public byte[] initFirstSector(File file){
header[0] = TransferSpecification.SOH;
header[1] = 0;
header[2] = (byte)255;
byte[] packet = new byte[133];
crc.resetInitValue();
innerdata = new byte[TransferSpecification.sizeSectorZero]; //128
// copy the file name
System.arraycopy(ConvertChartoByteArray(file.getName().toLowerCase().toCharArray()),0, innerdata, 0,file.getName().length());
// copy the file size
System.arraycopy(ConvertChartoByteArray(Long.toString(file.length()).toCharArray()),0, innerdata, file.getName().length()+1, Long.toString(file.length()).toCharArray().length);
System.arraycopy(innerdata, 0, packet, 3, innerdata.length);
System.arraycopy(header, 0, packet, 0, header.length);
// Calculate the CRC
crc.CRCCalculate(innerdata);
//checksum = crc.getCRC();
//intCrcHigh= (checksum>>8);
//intCrcLow = (checksum&0x00ff);
packet[131]= (byte)(crc.getCRCHigh());
packet[132]= (byte)(crc.getCRCLow());
//System.out.println("Module init first package!!");
//log.debug("Module init first package");
return packet;
}
/**
* Create the Non zero sector
* @param binaryfile
* @return the Non Zero Sector
*/
public byte[] initSector(byte[] binaryfile){
byte[] packet = new byte[1029];
header[0] = TransferSpecification.STX;
header[1] = (byte)packetnumber;
header[2] = (byte)(255-packetnumber);
innerdata = new byte[TransferSpecification.sizeSectorNonZero];
System.arraycopy(binaryfile, 0, innerdata, 0, binaryfile.length);
crc.resetInitValue();
crc.CRCCalculate(innerdata);
checksum = crc.getCRC();
//intCrcHigh= ((checksum>>8)& 0x00ff);
//intCrcLow = (checksum&0xff); //0x00ff
System.arraycopy(innerdata, 0, packet, 3, innerdata.length);
System.arraycopy(header, 0, packet, 0, header.length);
packet[1027] = (byte)(crc.getCRCHigh());
packet[1028] = (byte)(crc.getCRCLow());
//System.out.println("Module init package!!");
//log.debug("Module init package:" + packetnumber);
return packet;
}
public byte[] initSectorsmall(byte[] binaryfile){
byte[] packet = new byte[133];
header[0] = TransferSpecification.SOH;
header[1] = (byte)packetnumber;
header[2] = (byte)(255-packetnumber);
innerdata = new byte[TransferSpecification.sizeSectorZero];
System.arraycopy(binaryfile, 0, innerdata, 0, binaryfile.length);
crc.resetInitValue();
crc.CRCCalculate(innerdata);
checksum = crc.getCRC();
//intCrcHigh= ((checksum>>8)& 0x00ff);
//intCrcLow = (checksum&0xff); //0x00ff
System.arraycopy(innerdata, 0, packet, 3, innerdata.length);
System.arraycopy(header, 0, packet, 0, header.length);
packet[131] = (byte)(crc.getCRCHigh());
packet[132] = (byte)(crc.getCRCLow());
// System.out.println("Module init package!!");
//log.debug("Module init package:" + packetnumber);
return packet;
}
public byte[] initLastSector(){
header[0] = TransferSpecification.SOH;
header[1] = 0;
header[2] = (byte)255;
byte[] packet = new byte[133];
for(int i = 0;i< packet.length;i++){
packet[i]=0;
}
crc.resetInitValue();
innerdata = new byte[TransferSpecification.sizeSectorZero]; //128
// copy the file name
//System.arraycopy(ConvertChartoByteArray(file.getName().toLowerCase().toCharArray()),0, innerdata, 0,file.getName().length());
// copy the file size
//System.arraycopy(ConvertChartoByteArray(Long.toString(file.length()).toCharArray()),0, innerdata, file.getName().length()+1, Long.toString(file.length()).toCharArray().length);
System.arraycopy(innerdata, 0, packet, 3, innerdata.length);
System.arraycopy(header, 0, packet, 0, header.length);
// Calculate the CRC
crc.CRCCalculate(innerdata);
//checksum = crc.getCRC();
//intCrcHigh= (checksum>>8);
//intCrcLow = (checksum&0x00ff);
packet[131]= (byte)(crc.getCRCHigh());
packet[132]= (byte)(crc.getCRCLow());
//System.out.println("Module init first package!!");
//log.debug("Module init first package");
return packet;
}
/*
public byte[] initLastSector(byte[] binaryfile, int position){
byte[] packet = new byte[1024];
header[0] = TransferSpecification.STX;
header[1] = (byte)packetnumber;
header[2] = (byte)(packetnumber-255);
innerdata = new byte[TransferSpecification.sizeSectorNonZero];
crc.resetInitValue();
System.arraycopy(binaryfile, 0, innerdata, 0, binaryfile.length);
for(int i = position; i< 11; i++){
innerdata[i] = TransferSpecification.CPMEOF;
}
crc.CRCCalculate(innerdata);
checksum = crc.getCRC();
intCrcHigh= (checksum>>8);
intCrcLow = (checksum&0x00ff);
System.arraycopy(innerdata, 0, packet, 3, innerdata.length);
System.arraycopy(header, 0, packet, 0, header.length);
packet[131] = (byte)intCrcHigh;
packet[132] = (byte)intCrcLow;
//return innerdata;
System.out.println("Module init last package!!");
//log.debug("Module init last package");
return packet;
}
*
*/
/**!
* Convert A chararray to a byte array
* @param input Char array
* @return Byte Array
*/
private byte[] ConvertChartoByteArray(char[] input)
{
byte[] output = new byte[input.length];
for (int i = 0; i < output.length; i++)
{
output[i] = (byte)input[i];
}
return output;
}
}